#pragma once
#ifndef SPORTS_FACILITY_MANAGEMENT_H
#define SPORTS_FACILITY_MANAGEMENT_H
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <stdbool.h>

// 基本数据结构头文件
// 定义常量 (名字长度 电话长度 场地名字 用户名字)
#define MAX_NAME_LENGTH 20
#define MAX_PHONE_LENGTH 20
#define MAX_FACILITIES 20
#define MAX_USERS 20
#define MAX_USERNAME 20
#define MAX_PASSWORD 20

typedef struct User User;                       // 声明一下
typedef struct FacilityManager FacilityManager; // 声明一下
// 运动场地类型
typedef enum {
    BASKETBALL_COUNT = 1,   // 篮球场   1
    BADMINTON_COUNT,        // 羽毛球场 2
    FOOTBALL_COUNT,         // 足球场   3
    BILLIARDS_COUNT,        // 台球场   4
    TABLE_TENNIS_COUNT,     // 乒乓球场 5
    VOLLEYBALL_COUNT,       // 排球场   6
}VenueType;
typedef struct time {
    // 日期
    int year;                 // 年份(4位)
    int month;                // 月份（2位)
    int day;                  // 日期（2位)
    // 时间点
    int day_time[28];         // 08:00-22:00;
}tim;
typedef struct TNode {
    tim t;
    struct TNode* next;
}TNode;
// 时间链表
typedef struct TList {
    int num;        //个数
    TNode* head;    //头结点
}TList;
// 场地结构体
typedef struct {
    int id;                             // 场地编号
    char name[MAX_NAME_LENGTH];         // 场地名称
    int max_person_num;                 // 最大容纳人数
    int  manager_id;                    // 场地管理员
    VenueType type;                     // 场地类型
    int area;                           // 场地大小
    char open_time[MAX_NAME_LENGTH];    // 场地开放时间
    float price_per_half_hour;          // 每半小时的租用价格
    TList time_list;                    // 开发时间链表
} Facility;
// 场地结点
typedef struct FNode{
    Facility facility;      
    struct FNode* next;            
}FNode;
// 场地链表
typedef struct FList {
    int num;        //个数
    FNode* head;    //头结点
}FList;
// 场地负责人结构体
typedef struct FacilityManager{
    int id;                                     // 场地负责人ID
    char name[MAX_NAME_LENGTH];                 // 场地负责人姓名
    long long phone;                            // 场地负责人联系方式
    int num_facilities;                         // 负责人管理的场地数量
    Facility *facilities[MAX_FACILITIES];       // 负责人管理的场地数组
    char username[MAX_USERNAME];                // 场地负责人账号
    char password[MAX_PASSWORD];                // 场地负责人密码
} FacilityManager;
// 场地负责人结点
typedef struct FMNode {
    FacilityManager facility_manager;
    struct FMNode* next;
}FMNode;
// 场地负责人链表
typedef struct FMList {
    int num;        //个数
    FMNode* head;    //头结点
}FMList;
// 场馆使用记录结构体
typedef struct {
    User* user;
    Facility* facility;
    // 日期
    char year[5];                 // 年份(4位)
    char month[3];                // 月份（2位)
    char day[3];                  // 日期（2位)
    char begin_time[6];           // 开始时间
    char end_time[6];             // 结束时间
    // 标识
    bool is_end;                  // 是否结束
    int record_id;                // ID
}Record;
// 使用记录结点
typedef struct RENode {
    Record record;
    struct RENode* next;
}RENode;
// 使用记录链表
typedef struct REList {
    int num;        //个数
    int id;
    RENode* head;    //头结点
}REList;
//用户预约信息
typedef struct User_res {
	char name[50];                //真实姓名
	char id_name[50];             //身份证号码
	char phone[50];               //电话号码
	VenueType venue_Type;         //场地类型
    int  num;                     //场地编号
	char year[5];                 // 年份(4位)
	char month[3];                // 月份（2位)
	char day[3];                  // 日期（2位)
	char start_time[6];			  // 时间区间（如"08-10"）
	char end_time[6];
	int flag;                     //使用信息
    int res_count;                //预约编号
}User_res;
//用户预约节点
typedef struct Res_node {
	User_res user_res;                        //节点
	//struct res_node* next;           //指向下一个节点的指针
	struct Res_node* next;           //指向下一个节点的指针
}Res_node;
//用户预约链表
typedef struct Res_list {
	Res_node* head;
	int size;
    int id;                 //预约的编号
}Res_list;
//用户结构
typedef struct User {
    char id_nicknames[50];        //昵称
    char phone[50];               //电话号码
    char secret_code[50];         //密码
    char name[50];                //真实姓名
    char id_name[50];             //身份证号码
}User;
//用户节点
typedef struct User_node {
    User user;                        //节点
    struct User_node* next;           //指向下一个节点的指针
}User_node;
//用户链表
typedef struct User_list {
    User_node* head;
    int size;
}User_list;
// 系统结构体，用于存储系统数据
typedef struct {
    // 场地链表 负责人链表 用户链表 预订链表 使用记录链表
    FList facility_link;
    FMList facility_manager_link;
    User_list user_link;
    Res_list reservation_link;
    REList record_link;
    // 管理员账号密码
    char username[MAX_USERNAME];                
    char password[MAX_PASSWORD]; 
}System;

#endif // SPORTS_FACILITY_MANAGEMENT_H
